package ebj.common.java8.stream;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo {
    public static void main(String[] args) {
//        int[] nmbrs = new int[10];
//        for (int i = 0; i < nmbrs.length; i++) {
//            nmbrs[i] = MathUtils.betweenRandom(1, 25);
//        }
        // 从字符串转换成Stream
        String string = "3, 10, 15, 9, 14, 5, 12, 14, 9, 23";
        String[] split = string.split(",\\s");
        Stream<String> strs = Stream.of(split);
        
       // 从数组转换成Stream
        Integer[] nmbrs = new Integer[]{3, 10, 15, 9, 14, 5, 12, 14, 9, 23};
        Stream<Integer> nmbStream = Stream.of(nmbrs);
        
        // 测试去重和排序（含倒序）
//        Stream<Integer> sorted = nmbStream.collect(Collectors.toSet()).stream().sorted();
        /**
         *  测试字符串连接
         *  需要注意的点：
         *  如果Stream中的元素不是String类型的，请先使用map方法将所有元素转成String，
         *  否侧使用Collectors.joining方法将会导致异常
         */
//        String collect = sorted.map(Object::toString).collect(Collectors.joining(", "));
//        System.err.println("[" + collect + "]");
        
        // 创建 升序 和 降序 比较器
        final Comparator<Integer> intCmp = Integer::compareTo;
        final Comparator<Integer> reversedIntCmp = Comparator.reverseOrder();
        
        String collect2 = nmbStream.collect(Collectors.toSet()).stream()
//                .sorted(Integer::compareTo) /* 升序排列 */
//                .sorted((d1, d2) -> -Integer.compare(d1, d2)) /* 升序排列  -- 另一种写法 */
                .sorted(Comparator.reverseOrder()) /* 降序排列 */
                .map(Object::toString).collect(Collectors.joining(","));
        System.err.println("[" + collect2 + "]");
        
        System.out.println(Arrays.toString(nmbrs));
        
        // 即使没有元素满足filter中的条件，最终collect方法返回的结果也不会是null，而是一个size为0的集合（List或者Set等）
        List<Integer> collect = Stream.of(nmbrs).collect(Collectors.toSet()).stream().filter(num -> num == 0).collect(Collectors.toList());
        System.out.println(collect.size());
    }
}
